# 高阶函数
# 参数 或 返回值 中有函数

# def fun1(a = sum(1,2)):
#     sum([2,2])
#  ' √'

#   filter  map  reduce  sorted

#       迭代器    值

#     iterable          iterator
#  可迭代的 《容器》     迭代器

# lambda  参数 ： 返回值  匿名函数局限性，不能完成较复杂的功能
f = filter(lambda  x: x > 2 ,[1,2,3,4])
f2 = filter(lambda  x: x%2==0 ,[1,2,3,4]) # 返回值是True 的值  留下来了
print(next(f2))
print(next(f2))


# map  映射
print('----->map<-----')
m = map(lambda x:x**2,[1,2,3,4])
print(next(m))
print(next(m))
print(next(m))
print(next(m))

# sorted
s1 = sorted(['bcd','abcd','cd'],key=lambda x :ord(x[0]))
s2 = sorted(['bcd','abcd','cd'],key=lambda x :len(x))
s3 = sorted(['bcd','abcd','cd'],reverse=True)

# reduce
from functools import reduce
res = reduce(lambda x,y:x+y,[1,2,3,4,5])
print(res)


# 偏函数
# 函数的注释 (函数的元数据)
def fun2(a:int)->int:
    return 2


# 递归函数
# 自己调用自己的函数
#  理论上 循环的函数 都可以写成递归函数
#  两个要点 ：1 规律  2 出口
#  注意事项  递归层数太多，栈内存会崩溃

# 生成器  --》 从生成数据的角度起名
# 生成器也是迭代器  --》 从取数据的角度
# next()

# 生成器  vs  传统容器
# 占用内存小
# 存储的是一套运算规则和一个值
#  1）. yield ()
def gen():
    for i in range(1,11):
        yield i

#  2).  推导式
# g = (for i in range(1,11))





